Codage binaire des entiers relatifs |
Nous allons étudier la représentation des entiers
signés sur un octet (mais le nombre de bits pourra être inférieur ou supérieur
en fonction de la grandeur des nombres à coder, mais il faudra systématiquement
indiquer sur combien de bits se fait le codage).
1) Un premier codage
« naïf »
Un bit sur les 8 bits disponibles sera utilisé pour
coder le signe. C’est le bit de gauche (dit de fort poids) qui est utilisé :
S’il vaut 1 alors le
nombre codé est négatif
S’il vaut 0 alors le
nombre codé est positif
Code du signe |
Codage de la valeur
absolue |
|
||||||
1 |
x |
x |
x |
x |
x |
x |
x |
négatif |
0 |
x |
x |
x |
x |
x |
x |
x |
positif |
Octet |
|
On code donc le signe 0/1 puis sur les 7 bits suivants
la valeur absolue qui va donc de 0 à 27-1 (=127)
On peut donc coder ainsi de –127 à + 127 sur un octet
signé.
Exemples : 35=00100011 et
-35=10100011 codés sur un octet.
Inconvénients
de ce codage :
et -0 s’écrit 1000
0000
En effet : 1 + (-3) s’écrit, si l’on pose
l’opération d’addition binaire classique:
0000 0001
+ 1000 0011
---------------------------
= 1000 0100
ce qui serait le codage de –4 or 1+(-3) = -2 ….le résultat est donc faux
2) Codage par « complément à 2 » : qui permet
d’utiliser l’additionneur classique.
a) Introduction
Notre problème consiste à
coder les opposés des entiers positifs, or si n est un entier naturel, son
opposé est le nombre tel que leur somme soit nulle.
Ainsi sur un octet, l’opposé
de 0001 0110 doit être un nombre codé
sur un octet xxxx xxxx tel
que 0001 0110 + xxxx
xxxx= 0000 0000 réalisons l’« opération à trous» ou la
soustraction.
Ainsi 0001 0110 + 1110 1010= 10000 0000
il y a débordement de l’octet, mais le codage obtenu répond à nos attentes.Rem
0001 0110 + 1110 1010=
10000 0000 ce 1
sera ignoré.
De façon générale sur 1 octet, on cherchera l’opposé d’un entier
naturel n en posant
n+(-n)=28 ou encore -n=28-n
Ainsi en binaire, le codage de –n sera
le codage de 28-n. Or 28-n=28-1-n+1 c'est-à-dire 11111111-n+1 en binaire or on
remarque qu’effectuer 11111111-n revient
à « inverser » chaque bit ainsi l’opposé de n s’obtiendra en
inversant les bits de n puis en ajoutant 1.d'un entier négatif en binaire avec
b) Cas général deux sur N bits)
Soit N
le nombre de bits utilisés pour coder le nombre entier relatif n.
Si n
> 0 est (en base décimale) un entier inférieur ou égal à (c'est-à-dire tel qu'on puisse l'écrire en binaire en
complément à 2 sur N bits, dont celui « le plus à gauche » est donc
0), alors la
représentation en binaire en complément à
2 du nombre -n est, par définition, la
représentation en binaire sur N
bits du
nombre (en base décimale) . C'est pour cela qu'on parle de « complément à 2 »,
qui est une façon abrégée de parler du « complément à 2N » du
nombre n.
A
c) Dans la pratique
Algorithme de conversion en complément à 2
|
Exemple : codage de -58 en complément à 2 sur un octet
+ 1
|
Remarque 1: grâce aux nombres négatifs codés en complément à 2,
soustraire reviendra bien à effectuer une addition par l’opposé codé en CA2.
Remarque 2: pour trouver la valeur absolue en base 10 d’un codage CA2, il suffit
d’appliquer les deux dernières étapes de l’algorithme.
Exemple :
110001100CA2 correspond à un nombre négatif
Inversion : 00111001
+ 1
= 001110102 sa valeur absolue vaut 58 donc 110001100CA2= -5810
Exercice
1)
Coder en binaire
sur 10bits : 10810, -10810 et 4510 et -4510
, les négatifs seront codés en CA2 sur un octet.
45= 00 0010 11012 108= 00 011011002
-45=11 11010011CA2 -108=11 10010100 CA2
2)
Effectuer en
binaire les trois opérations
suivantes : 108+45 ;
108-45 puis 45-108
108+45 |
108-45 |
45-108 |
00
0010 1101 +00 0110 1100 -------------- =00 1001 1001 Vérification :
153 |
00 0110 1100 + 11 1101 0011 = 1 00
0011 1111 Ignorer le débordement Vérification :
63 |
00 0010 1101 +11 1001 0100 =11 1100 0001CA2 Vérification :
-63 |
Bilan addition signée
Lors
des additions signées, des débordements peuvent survenir. Dans ces cas, on néglige toujours le bit supplémentaire pour déterminer le
résultat final. Interprétation du
résultat final Son signe est
celui indiqué par le bit de poids fort
Si 0 : résultat est un nombre positif
Si 1 : nombre négatif Le résultat est directement codé en complément à 2
Sa valeur absolue est trouvée par le calcul du
complément à 2 |